package lider;

import java.util.ArrayList;
import java.util.Iterator;

import excepciones.AsientoYaSobreReservadoPorElUsuarioException;

public abstract class Gestionador {
	
	protected Aerolinea aerolinea;
	protected ArrayList<ListaSobreReserva> sobreReservas = new ArrayList<ListaSobreReserva>();
	
	public void setAerolinea(Aerolinea aero){
		this.aerolinea=aero;
	}
	
	public Aerolinea getAerolinea(){
		return this.aerolinea;
	}
	
	protected ListaSobreReserva buscarEnSobreReservas(Asiento asiento) {
		// busca dentro del arraylist de LANCHITA un objeto del tipo ListaSobreReserva en el cual el asiento 
		// coincida con el que se ingresa, si no lo encuentra devuelve un null
		
		// variables ------------------------------------------------------------------------------
		ListaSobreReserva asientoSobreReservadoAComparar = null;
		Asiento asientoAComparar = null;
		
		// codigo ---------------------------------------------------------------------------------
		for (Iterator<ListaSobreReserva> iterator = sobreReservas.iterator(); iterator.hasNext();) {
			asientoSobreReservadoAComparar = (ListaSobreReserva) iterator.next();
			asientoAComparar = asientoSobreReservadoAComparar.getAsiento();
			if (asientoAComparar.equals(asiento)) {
				
				// retorna el asiento con el arraylist de DNIs
				return asientoSobreReservadoAComparar;
			}
			
		}
		
		// como no retorno en el return anterior, retorna un null
		return null;
	}
	
	protected void buscarListaSobreReservaYRemover(Asiento asiento) {
		// busca la lista de sobrereserva del asiento (si es que existe) y
		// y la remueve de sobreReservasOceanic
		
		// variables ----------------------------------------------------------------------------------
		
		ListaSobreReserva listaARemover = this.buscarEnSobreReservas(asiento);
		
		// codigo -------------------------------------------------------------------------------------
		
		if (listaARemover != null) {
			sobreReservas.remove(listaARemover);
		}
	}

	protected void sobreReservarAsiento (String dni, Asiento asiento){
		
		// busca la lista correspondiente al asiento
		ListaSobreReserva listaSobreReserva = this.buscarEnSobreReservas(asiento);
		
		if (listaSobreReserva == null) {
			
			// si buscarEnSobreReservas devuelve un null se crea una nueva instancia de
			// listaSobreReserva
			listaSobreReserva = new ListaSobreReserva(asiento);
			sobreReservas.add(listaSobreReserva);
			
		}
		else {
			
			// si devuelve algo diferente de null, se checkea que el DNI no este repetido dentro del arraylist
			boolean estaRepetido = listaSobreReserva.dNIEstaRepetido(dni);
			
			if (estaRepetido) {
				// si esta repetido el DNI se lanza AsientoYaSobreReservadoException
				throw new AsientoYaSobreReservadoPorElUsuarioException();
				
			}
			
		}
		
		
		// agrega el DNI a la lista de sobrereservas
		listaSobreReserva.agregarPersonaEnSobreReserva(dni);					
		// hasta aca
		
	}
	
	public ArrayList<ListaSobreReserva> getListaSobreReservas() {
		return sobreReservas;
	}
	
	public abstract ArrayList<Asiento> buscarAsientosQueTengan(String origen, String destino, String fecha);
	
	public abstract ArrayList<Asiento> buscarAsientosSinFecha(String origen, String destino);

	public abstract void comprarAsiento(Asiento asiento, String dni);
	
	public abstract Asiento parsearAsiento(Object asientoParaParsear );

	public abstract double impuestos(Asiento asiento);
	
	public abstract void reservarAsiento(String dni, Asiento asiento);
	
	

}
